﻿using System;
using System.Threading;

namespace MaiYao
{
    public class 线程_
    {
        private Thread t;
        private ManualResetEvent QR;
        private Func<bool> func;
        private string 名称;
        private bool 线程已经结束 = false;
        private CancellationTokenSource cts;
        public 线程_(Func<bool> func, CancellationTokenSource cts, bool 是否阻塞 = false, string 名称 = "", bool 是后台线程 = false)
        {
            this.QR = new ManualResetEvent(是否阻塞);
            this.cts = cts;
            this.名称 = 名称;
            this.func = func;
            this.t = new Thread(this.包装函数);
            if (是后台线程)
            {
                this.t.IsBackground = true;
            }
            this.t.Start();
        }

        public bool 是否在运行 { get; set; } = false;

        private void 包装函数()
        {
            bool 条件 = true;
            do
            {
                QR.WaitOne();
                this.是否在运行 = true;
                条件 = !线程已经结束 && !cts.IsCancellationRequested && this.func();
            }
            while (条件);
            this.是否在运行 = false;
        }

        public void 暂停()
        {
            if (this.线程已经结束)
            {
                其他_.打印("线程已经结束: " + this.名称);
                return;
            }
            this.QR.Reset();
            其他_.打印("线程暂停: " + this.名称);
            this.是否在运行 = false;
        }

        public void 启动()
        {
            if (this.线程已经结束)
            {
                其他_.打印("线程已经结束: " + this.名称);
                return;
            }
            this.QR.Set();
        }

        public void 退出()
        {
            其他_.打印("线程退出: " + this.名称);
            this.线程已经结束 = true;
            if (this.是否在运行 == false) this.启动();
            其他_.打印("线程退出完成: " + this.名称);
            this.是否在运行 = false;
        }
    }
}
